---
id: 657dadf4d8b93c1704f3a57c
title: Крок 66
challengeType: 20
dashedName: step-66
---

# --description--

Код працює, але дещо можна покращити. По-перше, виклик функції з п’ятьма аргументами може створити плутанину щодо того, яке значення до якого параметра буде присвоєно.

Ви можете викликати функцію за допомогою аргументів ключових слів, тобто явно записуючи назву параметра, після якої написано оператор присвоєння та значення. Наприклад:

```py
def add(x, y):
    return x + y

add(x=1, y=7) # 8
```

Змініть виклик функції, щоб використати аргументи ключових слів.

# --hints--

Змінна `new_password` повинна мати значення `generate_password(length=8, nums=1, special_chars=1, uppercase=1, lowercase=1)`.

```js
({ test: () => assert.match(code, /^new_password\s*=\s*generate_password\s*\(\s*length\s*=\s*8\s*,\s*nums\s*=\s*1\s*,\s*special_chars\s*=\s*1\s*,\s*uppercase\s*=\s*1\s*,\s*lowercase\s*=\s*1\s*\)/m) })
```

# --seed--

## --seed-contents--

```py
import re
import secrets
import string


def generate_password(length, nums, special_chars, uppercase, lowercase):

    # Define the possible characters for the password
    letters = string.ascii_letters
    digits = string.digits
    symbols = string.punctuation

    # Combine all characters
    all_characters = letters + digits + symbols

    while True:
        password = ''
        # Generate password
        for _ in range(length):
            password += secrets.choice(all_characters)

        constraints = [
            (nums, r'\d'),
            (special_chars, fr'[{symbols}]'),
            (uppercase, r'[A-Z]'),
            (lowercase, r'[a-z]')
        ]

        # Check constraints        
        if all(
            constraint <= len(re.findall(pattern, password))
            for constraint, pattern in constraints
        ):
            break

    return password

--fcc-editable-region-- 
new_password = generate_password(8, 1, 1, 1, 1)
print(new_password)
--fcc-editable-region--
```
